#!/usr/bin/env python3
"""
perl-DBI MCP Server

面向软件：perl-DBI（Perl Database Interface）
提供对 perl-DBI 命令行操作的 MCP 工具封装

MCP tools 列表：
1. perl_dbi_available_drivers - 获取可用的 DBI 驱动程序列表
   用途：执行 Perl 脚本来获取当前系统可用的 DBI 数据库驱动程序
   参数：无
   返回：统一 JSON 结构，包含执行结果和驱动程序列表
"""

import subprocess
import json
from typing import Dict, Any
from mcp.server.fastmcp import FastMCP, Context

# 创建 MCP 服务器实例
mcp = FastMCP("Perl-DBI MCP Server")

@mcp.tool()
def perl_dbi_available_drivers(ctx: Context) -> Dict[str, Any]:
    """
    获取可用的 DBI 驱动程序列表
    
    用途：通过执行 Perl 脚本调用 DBI->available_drivers() 方法，
          返回当前系统可用的数据库驱动程序列表
    
    参数：无
    
    返回 JSON 结构：
    {
        "success": bool,      # 执行是否成功
        "command": str,       # 执行的命令
        "exit_code": int,     # 退出码
        "stdout": str,        # 标准输出（驱动程序列表）
        "stderr": str         # 标准错误输出
    }
    """
    # 创建 Perl 脚本内容
    perl_script = '''#!/usr/bin/perl

use strict;
use DBI;
my @ary = DBI->available_drivers();
print join("\\n", @ary), "\\n";
'''
    
    try:
        # 将脚本写入临时文件
        with open('/tmp/available_drivers.pl', 'w') as f:
            f.write(perl_script)
        
        # 添加执行权限
        subprocess.run(['chmod', '+x', '/tmp/available_drivers.pl'], check=True)
        
        # 执行 Perl 脚本
        result = subprocess.run(
            ['/tmp/available_drivers.pl'],
            capture_output=True,
            text=True,
            timeout=30
        )
        
        return {
            "success": result.returncode == 0,
            "command": "/tmp/available_drivers.pl",
            "exit_code": result.returncode,
            "stdout": result.stdout,
            "stderr": result.stderr
        }
        
    except subprocess.TimeoutExpired:
        return {
            "success": False,
            "command": "/tmp/available_drivers.pl",
            "exit_code": -1,
            "stdout": "",
            "stderr": "Command execution timed out"
        }
    except Exception as e:
        return {
            "success": False,
            "command": "/tmp/available_drivers.pl", 
            "exit_code": -1,
            "stdout": "",
            "stderr": f"Error executing command: {str(e)}"
        }

if __name__ == "__main__":
    mcp.run()